package com.lcc.forum.demos.web.exception;

import com.lcc.forum.demos.web.common.AppResult;
import com.lcc.forum.demos.web.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

//全局异常处理类
@Slf4j //打印日志的注解
@ControllerAdvice //表示控制器通知类
public class GlobalExceptionHandler {
    //出现异常后,捕获异常,将AppResult返回给客户端
    @ResponseBody//将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端
    @ExceptionHandler(ApplicationException.class)//具体要处理哪个异常类,也就是参数表示要处理哪种异常
    public AppResult applicationException(ApplicationException e){
        //方法实现
        //打印异常信息
        e.printStackTrace();//在上生产前要删除
        //日志打印异常
        log.error(e.getMessage());
        if (e.getErrorResult() != null){
            return e.getErrorResult();
        }
        //非空校验
        if (e.getMessage() == null ||e.getMessage().equals("")){
            return AppResult.failed(ResultCode.ERROR_SERVICES);
        }
        //返回具体的异常信息
        return AppResult.failed(e.getMessage());
    }
    //针对自定义的异常捕获不了的异常,给出一个兜底处理
    @ResponseBody
    @ExceptionHandler(Exception.class)//让其处理Exception类的异常
    public AppResult exceptionHandler(Exception e){
        //打印异常信息
        e.printStackTrace();
        //打印日志
        log.error(e.getMessage());
        //非空校验
        if (e.getMessage() == null || e.getMessage().equals("")){
            return AppResult.failed(ResultCode.ERROR_SERVICES);
        }
        //返回异常信息
        return AppResult.failed(e.getMessage());
    }
}
